package com.hsj.config;


import com.hsj.domain.Book;

import lombok.Data;
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.context.annotation.ImportResource;

/**
 *  该配置类 主要是 将xml、注解 配置的对象 都放入spring容器
 */

//@Configuration
//@ImportResource("applicationContext1.xml")    //如果 既要用xml配置 又要有@注解配置， 可以用ImportResource将 xml配置文件告诉配置类即可
//@Configuration(proxyBeanMethods = false)      //设置 创建出来的对象是不是代理对象，默认是true 返回的是代理对象             false不是代理对象
//@Import({Book.class})                         //给spring容器加bean，最简单直接  创建出来的对象名 是一个全路径类名
//@Import(MyImportSelector.class)               //根据MyImportSelector里面 的各种条件判断 是否装入bean

public class SpringConfig {
    @Bean  //@Configuration 和 @Bean 两个注解能保证  在该类中你每次使用 newBook()，获得到的book对象 都是从spring容器中拿到的 单例对象， 如果少了一个注解每次创建都是新的对象
    public Book newBook(){
        return new Book();
    }
    //springboot 经常使用 从容器中获的 SpringConfig对象， 然后拿着 springConfig.newBook() 多次， 获得的都是代理对象创建的单例对象

    // 往spring注册的bean， 如果bean是一样的，新的bean会 覆盖掉 旧的bean




//    @Bean
//    @ConditionalOnClass(Mouse.class)   //当 spring容器 有  mouse这个类， 才会去加载Cat
//    @ConditionalOnMissingBean(name = "com.hsj.config.Wolf")
//    @ConditionalOnMissingBean(Wolf.class)  //当 spring容器 没有 wolf这个类， 才会去加载Cat
//    @ConditionalOnBean(name="tom")     //当 spring容器 有叫 tom的 这个对象，才会去加载
    public Cat tom(){
        return new Cat();
    }
}


@Data
class Mouse{}
@Data
class Cat{}
@Data
class Wolf{}
